/**
 * 
 */
package ar.edu.utn.frba.tacs.grupo04.CarpielaCarpeta.Usuarios;

import java.util.Collection;
import java.util.HashSet;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import ar.edu.utn.frba.tacs.grupo04.CarpielaCarpeta.Core.Buscable;
import ar.edu.utn.frba.tacs.grupo04.CarpielaCarpeta.Mensajeria.Mensaje;
import ar.edu.utn.frba.tacs.grupo04.CarpielaCarpeta.Mensajeria.Mensajeable;

/**
 * @author Jose
 * 
 */
@Entity
@Table(name = "GRUPO")
public class Grupo implements Mensajeable, Buscable {

	@ManyToMany
	@JoinTable(name = "USUARIOS_GRUPOS", 
			joinColumns = { @JoinColumn(name = "GRUPOS_ID") }, 
			inverseJoinColumns = { @JoinColumn(name = "USUARIOS_ID") })
	private Collection<Usuario> Usuarios;

	@Id
	@Column(name = "NOMBRE")
	private String Nombre;

	public Grupo() {
	}

	public Grupo(String nombre) {
		this.Nombre = nombre;
		this.Usuarios = new HashSet<Usuario>();
	}

	public void DarseDeBaja(Usuario usuario) {

		this.Usuarios.remove(usuario);
	}

	public void EjecutarAccion(Usuario usuario) {
		Unirse(usuario);
	}

	public boolean EstaSuscripto(Usuario usuario) {

		return (this.getUsuarios().contains(usuario));
	}

	public String getAccionName() {
		return "Unirse";
	}

	public String getClaveBusqueda() {
		return getNombre();
	}

	public String getNombre() {
		return this.Nombre;
	}

	public Collection<Usuario> getUsuarios() {
		return this.Usuarios;
	}

	/***
	 * Implementacion de Mensajeable. Agrega el mensaje al listado.
	 * 
	 * @param Mensaje
	 *            tiene que ser USUARIO.
	 */

	public void RecibirMensaje(Mensaje mensaje) {
		for (Usuario u : Usuarios) {
			u.RecibirMensaje(mensaje);
		}
	}

	public void setUsuarios(Collection<Usuario> usuarios) {
		Usuarios = usuarios;
	}

	public void Unirse(Usuario usuario) {

		this.Usuarios.add(usuario);
	}

}